package fr.babos.test.virtual 
{
	import com.greensock.easing.Cubic;
	import com.greensock.easing.Strong;
	import com.greensock.TweenMax;
	import flash.desktop.NativeApplication;
	import flash.display.Bitmap;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.TouchEvent;
	import flash.geom.Matrix;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.Capabilities;
	import flash.text.AntiAliasType;
	import flash.text.TextField;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	import flash.utils.getTimer;
	import fr.babos.graphic.components.base.BorderContainer;
	import fr.babos.graphic.components.base.IResizableComponent;
	import fr.babos.graphic.components.base.ResizableComponent;
	import fr.babos.graphic.components.base.StageWrapper;
	import fr.babos.graphic.components.controls.lists.IVirtualListDelegate;
	import fr.babos.graphic.components.controls.lists.VirtualList;
	import fr.babos.graphic.medias.ImageLoader;
	import fr.babos.test.virtual.elements.TweetListElement;
	import fr.babos.test.virtual.items.TweetItem;
	import fr.babos.touch.emulator.MouseToTouchEmulator;
	import fr.babos.touch.indicator.TouchIndicator;
	import fr.babos.utils.ArrayUtils;
	import fr.babos.utils.EnvUtils;
	import fr.babos.utils.ScreenUtils;
	import net.hires.debug.Stats;
	
	/**
	 * @author ZoulouX
	 */
	public class VirtualListTest extends Sprite implements IVirtualListDelegate
	{
		[Embed(source="../../../../../lib/graphics/ipad-topbar-back.png")]
		public static const IPadTopbarBack	:Class;
		
		//[Embed(source="../../../../../lib/graphics/ios-background.png")]
		//public static const IOSBackground	:Class;
		
		private var _wrapper				:StageWrapper;
		private var _container				:ResizableComponent;
		private var _virtualList1			:VirtualList;
		private var _topBarBitmap			:Bitmap;
		private var _twitterData			:Object;
		private var _background				:Bitmap;
		
		public function VirtualListTest ()
		{
			if (stage != null)
				init()
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init (e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			// Configurer le stage
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.frameRate = 60;
			
			stage.addEventListener(Event.DEACTIVATE, function (event:Event):void {
				trace("DEACTIVATE");
			});
			stage.addEventListener(Event.ACTIVATE, function (event:Event):void {
				trace("ACTIVATE");
			});
			
			// Configurer le multitouch
			if (Multitouch.supportsTouchEvents)
			{
				Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
				//TouchIndicator.enableOn(stage);
			}
			else
			{
				MouseToTouchEmulator.emulate(stage, true, true, false);
			}
			
			// Mapper le DPI automatiquement grâce au wrapper ?
			// On part de la définition et du DPI du 3GS pour le mobile, et on reste sur 72 DPI sur PC / MAC
			// On déduit la taille de l'écran avec ces 3 valeurs
			// Et on appliquer le scale correspondant dans le wrapper.
			trace(Capabilities.screenDPI, Capabilities.screenResolutionX, Capabilities.screenResolutionY);
			
			// Créer le wrapper de l'application
			_wrapper = new StageWrapper(stage);
			
			// Le fond de l'application
			//_background = new IOSBackground() as Bitmap;
			//_background.width = 320;
			//_background.height = 640;
			//_wrapper.addChild(_background);
			
			// La barre du dessus
			var topBarContainer:Sprite = new Sprite();
			_topBarBitmap = new IPadTopbarBack() as Bitmap;
			_topBarBitmap.height = 44;
			topBarContainer.addEventListener(TouchEvent.TOUCH_TAP, gotoTopHandler);
			topBarContainer.addChild(_topBarBitmap);
			_wrapper.addChild(topBarContainer);
			
			// Ecouter les redimensionnement du wrapper
			_wrapper.onResized.add(function ():void {
				// Redimensionner le fond et la barre du haut
				_topBarBitmap.width = _wrapper.width;
				//_background.width = _wrapper.width;
				//_background.height = _wrapper.height;
			});
			
			// Le service
			//var serviceURL:String = "http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=zouloux&count=40";
			//var serviceURL:String = "http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=zouloux&count=100";
			var serviceURL:String = "http://search.twitter.com/search.json?q=twitterapi&rpp=300&include_entities=true&result_type=mixed";
			//var serviceURL:String = "http://search.twitter.com/search.json?q=flash&rpp=1&include_entities=true&result_type=mixed";
			
			var urlLoader:URLLoader = new URLLoader(new URLRequest(serviceURL));
			urlLoader.addEventListener(Event.COMPLETE, dataLoadedHandler);
			
			//trace("loading");
			
			//dataLoadedHandler();
		}
		
		/**
		 * Les données sont prêtes
		 */
		public function dataLoadedHandler (event:Event = null):void
		{
			trace("loaded");
			
			// Ne plus écouter
			(event.currentTarget as URLLoader).removeEventListener(Event.COMPLETE, dataLoadedHandler);
			
			// Parser
			_twitterData = JSON.parse((event.currentTarget as URLLoader).data);
			//_twitterData = {};
			
			// Redéfinir la base selon le service
			if (_twitterData.results != null)
				_twitterData = _twitterData.results;
			
			// L'action de remontée
			_wrapper.onGotoTop.add(gotoTopHandler);
			
			// Le container pour vérifier le fonctionnement des masques
			//_container = new ResizableComponent().place(getVListTipicalElementSize(_virtualList1) + 10, 10, getVListTipicalElementSize(_virtualList1) + 10, 10).into(_wrapper, "container") as ResizableComponent;
			//_container = new ResizableComponent().place(44, 0, 44, 0).into(_wrapper, "container") as ResizableComponent;
			_container = new ResizableComponent().place(0, 0, 0, 0).into(_wrapper, "container") as ResizableComponent;
			//_container = new ResizableComponent().place(200, 0, 200, 0).into(_wrapper, "container") as ResizableComponent;
			
			
			// La liste virtuelle
			_virtualList1 = new VirtualList(this, VirtualList.VERTICAL_ORIENTATION).place(0, 0, 0, 0).into(_container, "virtualList") as VirtualList;
			//_virtualList1.step = true;
			//_virtualList1.directStep = true;
			//_virtualList1.maskType = VirtualList.NO_MASK_TYPE;
			//_virtualList1.maskType = VirtualList.DOUBLE_MASK_TYPE;
			//_virtualList1.maskType = VirtualList.ALPHA_MASK_TYPE;
			//_virtualList1.maskType = VirtualList.SCALE_MASK_TYPE;
			
			if (EnvUtils.getDeviceType() == EnvUtils.TABLET)
			{
				_virtualList1.place(0, NaN, 0, 0).size(600, NaN);
				new BorderContainer(0xcccccc, 1).place(0, NaN, 0, 0).size(600, NaN).into(_container, "border").cab(true);
			}
			
			//_virtualList1.container.place(0, 0, 0, 0);
			_virtualList1.container.place(44, 0, 0, 0);
			//_virtualList1.container.place(200, 0, 200, 0);
			//_virtualList1.currentScroll = -5000;
			
			// Ajouter la bordure
			//new BorderContainer(0xcc0000, 1).place(0, 0, 0, 0).into(_container, "border").cab(true);
			//new BorderContainer(0xFF0000, 1).place(-getVListTipicalElementSize(_virtualList1), 0, -getVListTipicalElementSize(_virtualList1), 0).into(_container, "border").cab(true);
			//new BorderContainer(0xFF0000, 1).place(NaN, 0, NaN, 0).center(NaN, 0).setSize(NaN, getVListTipicalElementSize(_virtualList1)).into(_container, "border").cab(true);
			
			// Replacer la barre au premier plan
			if (_wrapper.contains(_topBarBitmap.parent))
				_wrapper.setChildIndex(_topBarBitmap.parent, _wrapper.numChildren - 1);
			
			// Ajouter les stats
			//var s:Stats = new Stats();
			//s.scaleY = s.scaleX = 1 / ScreenUtils.getRatioForStage(stage);
			//_wrapper.addChild(s);
		}
		
		/**
		 * Action de retour au début
		 * @param	event
		 */
		public function gotoTopHandler (event:TouchEvent = null):void
		{
			//_virtualList1.showIndex(0);
			//_virtualList1.currentScroll = 0;
			
			// Tweener la liste vers le haut
			TweenMax.to(_virtualList1, .7 - _virtualList1.currentScroll / 1000, {
				currentScroll: 0,
				ease: Cubic.easeInOut
			});
		}
		
		/**
		 * Récupérer le premier index de la liste
		 * @param	pTarget
		 * @return
		 */
		public function getVListFirstElementIndex (pTarget:VirtualList):int
		{
			return 0;
		}
		
		/**
		 * Récupérer le dernier index de la liste
		 * @param	pTarget
		 * @return
		 */
		public function getVListLastElementIndex (pTarget:VirtualList):int 
		{
			//return 100;
			return Math.max(0, _twitterData.length - 1);
		}
		
		/**
		 * Récupérer la taille moyenne d'un élément
		 * @param	pTarget
		 * @return
		 */
		public function getVListTipicalElementSize (pTarget:VirtualList):int
		{
			return 80;
		}
		/**
		 * Récupérer la taille spécifique d'un élément
		 * @param	pTarget : La liste qui réclame cette hauteur
		 * @param	pIndex : L'index de l'élément dont on souhaite la hauteur
		 * @return : Retourner 0 ou NaN si tous les éléments ont la même taille.
		 */
		public function getVListSpecificElementSize (pTarget:VirtualList, pIndex:uint):int
		{
			return NaN;
		}
		
		/**
		 * Besoin d'un élément a tel index
		 * @param	pTarget
		 * @param	pIndex
		 * @return
		 */
		public function getVListElementAt (pTarget:VirtualList, pIndex:int):ResizableComponent
		{
			//trace("NEED ELEMENT", pIndex)//, _twitterData[pIndex]);
			
			// Si une données du service correspond a cet index
			if (_twitterData[pIndex] != null)
			//if (pIndex >= getVListFirstElementIndex(pTarget) && pIndex <= getVListLastElementIndex(pTarget))
			{
				// On créé l'item
				var item:TweetItem = new TweetItem();
				
				// On cible les données dans le service
				var tweetElement:Object = _twitterData[pIndex];
				
				// Fonction de suppression de cet item
				item.remove = function (pElement:ResizableComponent):void
				{
					_twitterData = ArrayUtils.deleteElement(_twitterData as Array, tweetElement);
					_virtualList1.removeElement(pElement);
					_virtualList1.update();
				}
				
				// Le texte du tweet
				item.text = pIndex + " " + tweetElement.text;
				//item.text = String(pIndex) + " - " + String(getTimer());
				//item.screenName = "test";
				
				// L'image du tweet
				if (tweetElement.profile_image_url != null)
					item.avatar = tweetElement.profile_image_url;
				else if (tweetElement.user != null)
					item.avatar = tweetElement.user.profile_image_url;
				
				// Le nom d'utilisateur du tweet
				if (tweetElement.from_user != null)
					item.screenName = tweetElement.from_user;
				else if (tweetElement.user != null)
					item.screenName = tweetElement.user.screen_name;
				
				// Ajouter l'élément
				return new TweetListElement(item);
			}
			else
			{
				// Ajouter un élément vide
				return new TweetListElement();
			}
		}
	}
}